import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/cupertino.dart';
import 'package:safetymonitor/app/core/core.dart';
import 'package:safetymonitor/generated/assets.dart';

// 定义一个函数类型DataLoad，用于加载数据
typedef DataLoad<T> = Future<List<T>> Function(
  int pageNum,
  int pageSize, {
  String? search, //搜索关键字
});

/// 定义CustomEasyRefreshList类，它是一个带有下拉刷新和上拉加载更多功能的ListView
/// demo:
/// ```dart
/// CustomEasyRefreshList<GetTargetTaskingEntity>(
///   key: controller.globalKey,
///   enableLoad: false,
///   dataLoad: controller.getTaskListAPP,
///   itemBuilder: (item, index) {
///     return _getTaskItem(item, index);
///   }
/// );
/// ```
class CustomEasyRefreshList<T> extends StatefulWidget {
  const CustomEasyRefreshList({
    required this.dataLoad, // 加载数据的函数
    required this.itemBuilder, // 构建列表项的函数
    super.key,
    this.pageSize = 20, // 每页数据的数量
    this.enableRefresh = true, // 是否启用下拉刷新
    this.enableLoad = true, // 是否启用上拉加载更多
    this.firstRefresh = true, // 是否在第一次加载时自动刷新
    this.firstLoad = false, // 是否在第一次加载
    this.autoLoad = true, // 是否自动加载
    this.autoLoadMore = false, // 是否自动加载更多
    this.showEmpty = true, // 是否显示空数据提示
    this.padding, // 列表的内边距
    this.isShowSearch = false, // 是否显示搜索框
    this.searchHint, // 搜索提示文字
    this.separated, // 分隔线
    this.emptyWidgetTwo,  //传如的新空数据
    this.isScrollPhysics = false, // 是否滑动
    this.emptyAssetHeight, // 空提示图片高度
  });

  final DataLoad<T> dataLoad; // 加载数据的函数
  final Widget Function(T item, int index) itemBuilder; // 构建列表项的函数
  final int pageSize; // 每页数据的数量
  final bool enableRefresh; // 是否启用下拉刷新
  final bool enableLoad; // 是否启用上拉加载更多
  final bool firstRefresh; // 是否在第一次加载时自动刷新
  final bool firstLoad; // 是否在第一次加载时自动加载更多
  final bool autoLoad; // 是否自动加载更多
  final bool autoLoadMore; // 是否自动加载更多
  final bool showEmpty; // 是否显示空数据提示
  final EdgeInsets? padding; // 列表的内边距
  final bool isShowSearch; // 是否显示搜索框
  final String? searchHint; // 搜索提示文字
  final Widget? separated; // 分割线
  final Widget? emptyWidgetTwo; //传如的新空数据
  final bool isScrollPhysics; // 是否滑动
  final double? emptyAssetHeight; // 空提示图片高度

  @override
  CustomEasyRefreshListState<T> createState() => CustomEasyRefreshListState<T>();
}

// 定义CustomEasyRefreshList的状态类_CustomEasyRefreshListState
class CustomEasyRefreshListState<T> extends State<CustomEasyRefreshList<T>> {
  List<T> listData = []; // 数据列表
  int _pageIndex = 1; // 当前页码
  bool _isEmpty = true; // 是否为空数据
  bool _isLoading = true; // 是否正在加载数据
  String? search; // 搜索关键字

  final EasyRefreshController _refreshController = EasyRefreshController(
    controlFinishRefresh: true,
    controlFinishLoad: true,
  ); // EasyRefresh控制器

  @override
  void initState() {
    super.initState();
    if (widget.firstRefresh) {
      onRefresh();
    } else if (widget.firstLoad) {
      _onLoad();
    }
  }

  @override
  void dispose() {
    _refreshController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Visibility(
          visible: widget.isShowSearch,
          child: Container(
              height: 38.w,
              margin: EdgeInsets.only(bottom: 16.w),
              padding: EdgeInsets.symmetric(horizontal: 12.w),
              alignment: Alignment.center,
              decoration: BoxDecoration(color: Colors.white, border: Border.all(color: const Color(0xffF0F0F0), width: 1.w), borderRadius: BorderRadius.all(Radius.circular(8.w))),
              child: Row(
                children: [
                  // SvgPicture.asset(
                  //   AppImages.icon_search,
                  //   width: 16.w,
                  // ),
                  Expanded(
                      child: TextField(
                          keyboardType: TextInputType.text,
                          textInputAction: TextInputAction.done,
                          style: TextStyle(color: const Color(0xff222222), fontWeight: FontWeight.w400, fontSize: 14.sp),
                          onChanged: (value) {
                            search = value;
                            onRefresh();
                          },
                          decoration: InputDecoration(
                            counterText: '',
                            //防止适配不居中
                            isCollapsed: true,
                            border: const OutlineInputBorder(borderSide: BorderSide.none),
                            contentPadding: EdgeInsets.only(left: 8.w),
                            hintText: widget.searchHint ?? '请输入关键词搜索',
                            hintStyle: TextStyle(fontSize: 14.sp, fontWeight: FontWeight.w400, color: const Color(0xffA0A7B5)),
                          )))
                ],
              )),
        ),
        Expanded(
          child: EasyRefresh(
            // key: widget.key,
            onRefresh: widget.enableRefresh ? onRefresh : null,
            // 下拉刷新回调函数
            onLoad: widget.enableLoad ? _onLoad : null,
            // 上拉加载更多回调函数
            controller: widget.autoLoadMore ? null : _refreshController,
            // 控制器
            child: _isLoading
                ? Center(
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.center,
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        const CupertinoActivityIndicator(),
                        AppGaps.vGap16,
                        Text('加载中', style: TextStyles.grey_14_bold),
                      ],
                    ),
                  )
                : _isEmpty // 如果数据为空
                    ? widget.showEmpty // 如果需要显示空数据提示
                        ? _buildEmptyWidget()
                        : widget.emptyWidgetTwo??Container() // 否则返回空容器
                    : ListView.separated(
                        // controller: PrimaryScrollController.of(context),
                        // 使用 PrimaryScrollController 的 controller
                        physics: widget.isScrollPhysics ? const NeverScrollableScrollPhysics() : const AlwaysScrollableScrollPhysics(),
                        padding: widget.padding,
                        // 列表的内边距
                        // 否则返回ListView
                        itemBuilder: (context, index) {
                          return widget.itemBuilder(listData[index], index); // 构建列表项
                        },
                        separatorBuilder: (context, index) {
                          return widget.separated ?? AppGaps.vGap16; // 列表项之间的分隔符
                        },
                        itemCount: listData.length, // 列表项数量

                        // keyboardDismissBehavior: OnDrag(), // 在拖动时收起软键盘
                      ),
          ),
        ),
      ],
    );
  }

  // 构建空数据提示
  Widget _buildEmptyWidget() {
    return CustomScrollView(
      slivers: [
        SliverFillViewport(
          delegate: SliverChildBuilderDelegate(
            (context, index) {
              return Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  SvgPicture.asset(Assets.svgIconNone, height: widget.emptyAssetHeight ?? 300.w),
                  Text(
                    '-- 暂无数据 --',
                    style: TextStyle(fontSize: 14.w, height: 1.2, color: const Color(0xff4D5956), fontWeight: FontWeight.w400),
                  )
                ],
              );
            },
            childCount: 1,
          ),
        )
      ],
    );
  }

  // 下拉刷新回调函数
  Future<void> onRefresh() async {
    _pageIndex = 1; // 重置页码
    final List<T> dataList = await widget.dataLoad(_pageIndex, widget.pageSize, search: search); // 加载数据
    if (mounted) {
      // 如果挂载
      setState(() {
        _isLoading = false; // 更新是否正在加载数据
        listData = dataList; // 更新数据列表
        _isEmpty = listData.isEmpty; // 更新是否为空数据
        if (_isEmpty) {
          // 如果为空数据
          _refreshController.finishRefresh(IndicatorResult.success); // 显示没有更多数据
        } else {
          _refreshController.finishRefresh(IndicatorResult.success); // 显示刷新成功
        }
      });
    }
  }

  // 上拉加载更多回调函数
  Future<void> _onLoad() async {
    _pageIndex++; // 增加页码
    final List<T> dataList = await widget.dataLoad(_pageIndex, widget.pageSize); // 加载数据
    listData.addAll(dataList); // 更新数据列表
    _isEmpty = listData.isEmpty; // 更新是否为空数据
    if (dataList.isEmpty) {
      // 如果为空数据
      _refreshController.finishLoad(IndicatorResult.noMore); // 显示没有更多数据
    } else {
      _refreshController.finishLoad(IndicatorResult.success); // 显示加载更多成功
    }
    if (mounted) {
      setState(() {});
    }
  }

  // 使用 PrimaryScrollController 的 controller
  // 这样，NestedScrollView中的SliverAppBar和ListView.separated都会共享相同的ScrollController，确保它们的滚动行为协调一致。
  // 请注意，PrimaryScrollController是通过PrimaryScrollController.of(context)来获取的。这是因为它是一个InheritedWidget，可以在整个子树中共享。
  // 在EvaluateDetailPage&EvaluatePage Widget中，我们通过PrimaryScrollController.of(context)获取到了myScrollController。
  ScrollController? getController() {
    return PrimaryScrollController.of(context);
  }
}
